﻿using System;
using System.Collections.Generic;
using Eacademy.Domain.Repository;
using Eacademy.Domain.Abstractions;
using Eacademy.Domain.Models;
using Eacademy.Library.Helpers;
using Ninject;
using System.Web.Security;
using System.Linq;
using System.Web;

namespace Eacademy.Library.Membership
{
    public class CustomMembershipProvider : MembershipProvider
    {
        #region Unimplemented MembershipProvider Methods

        public override string ApplicationName { get; set; }

        public override bool ChangePassword(string username, string oldPassword, string newPassword)
        {
            throw new NotImplementedException();
        }

        public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
        {
            throw new NotImplementedException();
        }

        public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            throw new NotImplementedException();
        }

        public override bool DeleteUser(string username, bool deleteAllRelatedData)
        {
            throw new NotImplementedException();
        }

        public override bool EnablePasswordReset
        {
            get { throw new NotImplementedException(); }
        }

        public override bool EnablePasswordRetrieval
        {
            get { throw new NotImplementedException(); }
        }

        public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
        {
            throw new NotImplementedException();
        }

        public override int GetNumberOfUsersOnline()
        {
            throw new NotImplementedException();
        }

        public override string GetPassword(string username, string answer)
        {
            throw new NotImplementedException();
        }

        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            throw new NotImplementedException();
        }

        public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
        {
            throw new NotImplementedException();
        }

        public override string GetUserNameByEmail(string email)
        {
            throw new NotImplementedException();
        }

        public override int MaxInvalidPasswordAttempts
        {
            get { throw new NotImplementedException(); }
        }

        public override int MinRequiredNonAlphanumericCharacters
        {
            get { throw new NotImplementedException(); }
        }

        public override int MinRequiredPasswordLength
        {
            get { throw new NotImplementedException(); }
        }

        public override int PasswordAttemptWindow
        {
            get { throw new NotImplementedException(); }
        }

        public override MembershipPasswordFormat PasswordFormat
        {
            get { throw new NotImplementedException(); }
        }

        public override string PasswordStrengthRegularExpression
        {
            get { throw new NotImplementedException(); }
        }

        public override bool RequiresQuestionAndAnswer
        {
            get { throw new NotImplementedException(); }
        }

        public override bool RequiresUniqueEmail
        {
            get { throw new NotImplementedException(); }
        }

        public override string ResetPassword(string username, string answer)
        {
            throw new NotImplementedException();
        }

        public override bool UnlockUser(string userName)
        {
            throw new NotImplementedException();
        }

        public override void UpdateUser(MembershipUser user)
        {
            throw new NotImplementedException();
        }

        #endregion

        //private IUserRepository _userRepository = new UserRepository();

        //Ninject bindings
        private IUserRepository _userRepository;

        [Inject]
        public IUserRepository UserRepository
        {
            set
            {
                _userRepository = value;
            }
        }

        //private IProfileRepository _profileRepository;

        //[Inject]
        //public IProfileRepository ProfileRepository
        //{
        //    set
        //    {
        //        _profileRepository = value;
        //    }
        //}


        public User User
        {
            get
            {
                if (HttpContext.Current.Session["_user"] == null)
                {
                    return null;
                }
                return (User)HttpContext.Current.Session["_user"];
            }
            set
            {
                HttpContext.Current.Session["_user"] = value;
            }
        }

        //public Profile Profile
        //{
        //    get;
        //    set;
        //}


        public CustomMembershipProvider()
        {
            MvcApplication.Container.Inject(this);
        }

        public override bool ValidateUser(string username, string password)
        {
            if (string.IsNullOrEmpty(password.Trim())) return false;

            User user = _userRepository.GetUserByUsername(username);



            if (user == null) return false;

            user.UserType = UserHelper.GetUserTypeById(user.UserTypeId);

            string hash = PasswordHelper.ComputeHash(password, user.PasswordSalt);

            if (user.Password == hash)
            {
                User = user;
                User.Identification = KeyGenerator.GenerateRandomKey(5, 5, true, true, false);

                //Profile profile = _profileRepository.GetProfileByUserId(user.UserId);
                //this.Profile = profile;)

                return true;
            }

            return false;
        }
    }
}